package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

// User 1.定义模型
type User struct {
	gorm.Model //ID CreatAt UpdateAt DeleteAt
	Name       string
	Age        int64
}

// BadBoy 绑定一个TableName方法的方式
type BadBoy struct {
	gorm.Model
	BoyName string
	BoyAge  int64
}

func (BadBoy) TableName() string {
	return "goodboy"
}

func main() {
	db, err := gorm.Open("mysql",
		"root:root@(localhost)/db1?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	//2.把模型与数据库中的表对应起来
	db.AutoMigrate(&BadBoy{})

	//3.创建
	//u1 := User{Name: "雷恩加尔", Age: 18}
	//db.Create(&u1)
	//u2 := User{Name: "卡兹克", Age: 20}
	//db.Create(&u2)

	//4.查询
	//var user User //声明模型结构体类型变量user
	//user := new(User) //new和make的区别 make就是创建那channel,切片这样的数据结构   new创建的是基本数据类型或者结构体的指针
	//db.First(&user)
	//fmt.Printf("user:%#v\n", user)
	//
	//var users []User //传一个slice指针，查询所有的user
	//db.Debug().Find(&users)
	//fmt.Printf("users:%#v\n", users)

	//FirstOrInit  按照给定的条件进行查询，如果查不到，init初始化一个
	//var user User
	//db.FirstOrInit(&user, User{
	//	Name: "小王子",
	//})

	//创建User对象，User对象中的model设置对象
	//user := User{
	//	Model: gorm.Model{},
	//	Name:  "小王子",
	//	Age:   18,
	//}
	//
	//db.First(&user)

	//user := User{}
	//db.First(&user, 7)

	//查询条件，然后查询结果用对应的User类型装
	//db.Where("name=?", "jinzhu").First(&user)

	//db.Where("name <> ?", "jinzhu").Find(&user)
	//db.Where("name IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&user)
	//user := User{}

	//多结果用模型切片进行接收
	//db.Where("name LIKE ?", "%jin%").Find(&users)
	//db.Where("name=? AND age>=?", "jinzhu", "22").Find(&users)

	//可以看到表中create_time字段类型为int，可以知道存的是时间戳
	//因此变量startTime和endTime只要获取当前时间戳并转为int64即可，这样where时间比较才能有效
	//Loc, _ := time.LoadLocation("Asia/Shanghai")
	//start为时间字符串：“2022-08-28” 或 “2022-08-28 00：00：00”
	//start := "2022-08-28 00：00：00"
	//startTime, _ := time.ParseInLocation("2006-01-02", start, Loc)
	//还需要.Unix一下，才能获得int64
	//startTimeResult := startTime.Unix()

	//时间类型
	//db.Where("updated_at > ?", startTimeResult).Find(&users)

	//struct & map查询
	//struct
	//db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)

	//多结果集用什么类型接收
	//var users []User
	////user := User{}
	//db.Where([]int64{1, 2, 3}).Find(&users)
	//
	//fmt.Printf("user:%#v  \n", users)

	//当通过结构体进行查询时，GORM将会只通过非零字段查询，
	//这意味着如果你的字段值为0,'',false火鹤其他零值的时候，将不会被用于构建查询条件，例如:
	//db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users)

	//作用与where查询类似，当内联条件与多个立即执行方法一起使用时，内敛条件不会传递给后面的立即执行方法
	//db.Find(&user,"name=?", "jinzhu")
	//db.Find(&user, "name <> ? AND age > ?", "jinzhu", 20)
	//db.Find(&user, User{Age: 20})
	//db.Find(&user, map[string]interface{}{
	//	"age": 20
	//})

}
